package com.stadium.common.utils;

import com.stadium.common.enums.PositionEnum;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExcelUtils {

    /**
     * 判定Excel中某列是否有重复数据
     *
     * @param ignoreRows 读取数据忽略的行数，比如行头不需要读入 忽略的行数为1
     * @param column     需要判定的字段所在列的位置，比如需要判定的字段在第三列， column=2；注意，0是算第一列
     * @return 读出的Excel中数据的内容
     */

    public static List<String> judgeRepeatExcle(int column, int ignoreRows, Sheet sheet) throws Exception {
        List<String> retList = new ArrayList<>();
        if (column >= 0) {
            Cell cell = null;
            HashMap<String, String> map = new HashMap<String, String>();
            HashMap<String, String> tmap = new HashMap<String, String>();
            int firstRowNum = sheet.getFirstRowNum();
            int lastRowNum = sheet.getLastRowNum();

            firstRowNum = firstRowNum > ignoreRows ? firstRowNum : ignoreRows;
            Row row = null;
            for (int i = firstRowNum; i <= lastRowNum; i++) {
                row = sheet.getRow(i);          //取得第i行
                cell = row.getCell(column);        //取得i行的第column列
                String value = "";//保存i行的第column列的值
                if (cell != null) {
                    switch (cell.getCellType()) {
                        case HSSFCell.CELL_TYPE_STRING:
                            value = cell.getStringCellValue();
                            break;
                        case HSSFCell.CELL_TYPE_NUMERIC:
                            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                Date date = cell.getDateCellValue();
                                if (date != null) {
                                    value = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date);
                                } else {
                                    value = "";
                                }
                            } else {
                                value = new DecimalFormat("0").format(cell.getNumericCellValue());
                            }
                            break;
                        case HSSFCell.CELL_TYPE_FORMULA:
                            // 导入时如果为公式生成的数据则无值
                            if (!cell.getStringCellValue().equals("")) {
                                value = cell.getStringCellValue();
                            } else {
                                value = cell.getNumericCellValue() + "";
                            }
                            break;
                        case HSSFCell.CELL_TYPE_BLANK:
                            break;
                        case HSSFCell.CELL_TYPE_ERROR:
                            value = "";
                            break;
                        case HSSFCell.CELL_TYPE_BOOLEAN:
                            value = (cell.getBooleanCellValue() == true ? "Y" : "N");
                            break;
                        default:
                            value = "";
                    }

                }
                /*在excel中，计数是从0开始的，为了使结果与Excel中显示的行数保持一致，让行数newNum=为（i+1）
                 */
                int newNum = i + 1;
                if (map.containsKey(value)&&value!="") {//如果Map集合中包含指定的键名，则返回true；否则返回false。
                    String lineNum = map.get(value);//拿到先前保存的行号
                    //System.out.println("先前保存的行号value="+value+" lineNum="+lineNum);
                    if (tmap.containsKey(value)&&value!="") {
                        String str = tmap.get(value);//拿到先前保存的所有行号记录
                        tmap.put(value, str + " ," + newNum);//更新后，显示效果：——》行重复：在第 2 ，3 , 5
                    } else {
                        tmap.put(value, "Excel存在重复：行数位于第  " + lineNum + " ," + newNum);//最后显示效果：——》行重复：在第 2 ，3
                    }
                }
                map.put(value, newNum + "");//把i行的第column列的值与行号保存到map中
            }
            Iterator<Map.Entry<String, String>> it = tmap.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, String> entry = (Map.Entry<String, String>) it.next();
                System.out.println(entry.getKey() + " " + entry.getValue());
                retList.add(entry.getKey() + " " + entry.getValue());
            }
            return retList;
        }
        return retList;
    }

    //解决excel类型问题，获得数值
    @SuppressWarnings("static-access")
    public static String getValue(Cell cell) {
        String value = "";
        if (null == cell) {
            return value;
        }
        switch (cell.getCellType()) {
            //数值型
            case Cell.CELL_TYPE_NUMERIC:
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    //如果是date类型则 ，获取该cell的date值
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    value = format.format(date);
                } else {// 纯数字
                    BigDecimal big = new BigDecimal(cell.getNumericCellValue());
                    value = big.toString();
                    //解决1234.0  去掉后面的.0
                    if (null != value && !"".equals(value.trim())) {
                        String[] item = value.split("[.]");
                        if (1 < item.length && "0".equals(item[1])) {
                            value = item[0];
                        }
                    }
                }
                break;
            //字符串类型
            case Cell.CELL_TYPE_STRING:
                value = cell.getStringCellValue().toString();
                break;
            // 公式类型
            case Cell.CELL_TYPE_FORMULA:
                //读公式计算值
          /*      value = String.valueOf(cell.getNumericCellValue());
                if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
                    value = cell.getStringCellValue().toString();
                }
*/
                value = cell.getCellFormula().toString();

                break;
            // 布尔类型
            case Cell.CELL_TYPE_BOOLEAN:
                value = " " + cell.getBooleanCellValue();
                break;
            // 空值
            case Cell.CELL_TYPE_BLANK:
                value = "";
                break;
            // 故障
            case Cell.CELL_TYPE_ERROR:
                value = "";
                break;
            default:
                value = cell.getStringCellValue().toString();
        }
        if ("null".endsWith(value.trim())) {
            value = "";
        }
        return value.trim();
    }


    /**
     * @Description:
     * @Param: [
     * checkStatus,
     * excelValue,
     * map,
     * rowNum,
     * sysExcelModuleDetailId,
     * titleRow
     * ]
     * @return: java.util.Map<java.lang.String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               java.lang.Object>
     * @Author: firstSeven
     * @date: 2019/9/18
     */
    public static boolean checkValue(String checkStatus, Object excelValue) {
        Map<String, Object> retMap = new HashMap<>();
        if (checkStatus != null) {
            if (checkStatus.equals("身份证")) {
                boolean isture = IDCardUtil.isIDCard(String.valueOf(excelValue));
                return isture;
            } else if (checkStatus.equals("手机号码")) {
                /**
                 * 运营商号段如下：
                 * 中国联通号码：130、131、132、145（无线上网卡）、155、156、185（iPhone5上市后开放）、186、176（4G号段）、
                 *               175（2015年9月10日正式启用，暂只对北京、上海和广东投放办理）
                 * 中国移动号码：134、135、136、137、138、139、147（无线上网卡）、150、151、152、157、158、159、182、183、187、188、178
                 * 中国电信号码：133、153、180、181、189、177、173、149 虚拟运营商：170、1718、1719
                 * 手机号前3位的数字包括：
                 * 1 :1
                 * 2 :3,4,5,7,8
                 * 3 :0,1,2,3,4,5,6,7,8,9
                 * 总结： 目前java手机号码正则表达式有：
                 * a :"^1[3|4|5|7|8][0-9]\\d{4,8}$"    一般验证情况下这个就可以了
                 * b :"^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"
                 * Pattern和Matcher详解（字符串匹配和字节码）
                 */
                String regex = "^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[0-9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$";
                String value = String.valueOf(excelValue);
                if (value.length() != 11) {
                    return false;
                } else {
                    Pattern p = Pattern.compile(regex);
                    Matcher m = p.matcher(value);
                    boolean isMatch = m.matches();
                    return isMatch;
                }
            } else if (checkStatus.equals("邮箱")) {
                String value = String.valueOf(excelValue);
                if (value == null) {
                    return false;
                }
                String regEx1 = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
                Pattern p;
                Matcher m;
                p = Pattern.compile(regEx1);
                m = p.matcher(value);
                return m.matches();
            }else if(checkStatus.equals("位置名称")){
                String value = String.valueOf(excelValue);
                if (value == null) {
                    return false;
                }
                if (PositionEnum.getPositonByName(value)!=null){
                    return true;
                }else {
                    return false;
                }
            } else {
                //checkStatus 只能是身份证、手机号码、邮箱
                return false;
            }
        } else {
            //checkStatus 不能为空
            return false;
        }

    }

}
